diff -Naurp1 a/config.def.h b/config.def.h
--- a/config.def.h	2020-11-26 18:35:54.844066000 +0000
+++ b/config.def.h	2020-11-26 21:20:01.944961005 +0000
@@ -201,2 +201,3 @@ static Shortcut shortcuts[] = {
 	{ TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} },
+	{ TERMMOD,              XK_Return,      newterm,        {.i =  0} },
 };
diff -Naurp1 a/st.c b/st.c
--- a/st.c	2020-11-26 18:35:54.846066000 +0000
+++ b/st.c	2020-11-26 21:21:20.111983783 +0000
@@ -155,2 +155,3 @@ typedef struct {
 static void execsh(char *, char **);
+static char *getcwd_by_pid(pid_t pid);
 static void stty(char **);
@@ -1059,2 +1060,22 @@ tswapscreen(void)
 }
+
+void
+newterm(const Arg* a)
+{
+	switch (fork()) {
+	case -1:
+		die("fork failed: %s\n", strerror(errno));
+		break;
+	case 0:
+		chdir(getcwd_by_pid(pid));
+		execlp("st", "./st", NULL);
+		break;
+	}
+}
+
+static char *getcwd_by_pid(pid_t pid) {
+	char buf[32];
+	snprintf(buf, sizeof buf, "/proc/%d/cwd", pid);
+	return realpath(buf, NULL);
+}
 
diff -Naurp1 a/st.h b/st.h
--- a/st.h	2020-11-26 18:35:54.846066000 +0000
+++ b/st.h	2020-11-26 21:21:48.068634276 +0000
@@ -83,2 +83,3 @@ void draw(void);
 
+void newterm(const Arg *);
 void printscreen(const Arg *);
